package com.atguigu.aiproject.agent;

import com.atguigu.aiproject.entity.Creation;
import com.atguigu.aiproject.entity.User;
import com.atguigu.aiproject.mapper.CreationMapper;
import com.atguigu.aiproject.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 智能推荐智能体
 * 根据用户历史行为和偏好，为其推荐相关内容
 */
@Component
@Slf4j
public class RecommendationAgent {
    
    @Autowired
    @Qualifier("chatClient")
    private ChatClient chatClient;
    
    @Autowired
    private CreationMapper creationMapper;
    
    @Autowired
    private UserMapper userMapper;
    
    // 定义推荐内容生成的提示模板
    private static final String RECOMMENDATION_PROMPT_TEMPLATE = """
            你是一个专业的AI内容推荐专家，能够根据用户的个人信息，为其推荐可能感兴趣的内容。
            
            用户信息：
            用户ID：{userId}
            用户昵称：{userNickName}
            
            热门内容列表：
            {popularContent}
            
            用户点赞过的内容：
            {likedContent}
            
            请根据以上信息，分析用户的兴趣偏好，并从以下可推荐内容列表中挑选最符合用户兴趣的5条内容进行推荐：
            {availableContent}
            
            要求：
            1. 推荐内容应与用户已点赞的内容在主题或类型上相关
            2. 优先推荐热门但用户未点赞的内容
            3. 推荐理由要具体，说明为什么推荐这些内容
            4. 输出格式为JSON数组，每个元素包含creationId和reason字段
            5. 仅输出JSON，不要添加其他说明
            
            示例输出格式：
            [
              {"creationId": 1, "reason": "基于您对科技类文章的偏好，推荐这篇热门的人工智能发展分析"},
              {"creationId": 2, "reason": "您之前点赞了类似的散文作品，这篇热门散文相信您会喜欢"}
            ]
            """;

    /**
     * 为指定用户生成推荐内容
     * 
     * @param userId 用户ID
     * @return 推荐内容列表及推荐理由
     */
    public String generateRecommendations(Integer userId) {
        // 获取用户信息
        User user = userMapper.selectById(userId);
        if (user == null) {
            return "[]";
        }
        
        // 获取热门内容
        String popularContent = getPopularContent();
        
        // 获取用户点赞过的内容（模拟）
        String likedContent = getMockLikedContent(userId);
        
        // 获取可推荐的内容列表
        String availableContent = getAvailableContent(userId);
        
        // 构建提示词
        PromptTemplate promptTemplate = new PromptTemplate(RECOMMENDATION_PROMPT_TEMPLATE);
        Map<String, Object> model = new HashMap<>();
        model.put("userId", userId);
        model.put("userNickName", user.getNickName());
        model.put("popularContent", popularContent);
        model.put("likedContent", likedContent);
        model.put("availableContent", availableContent);
        
        Prompt prompt = promptTemplate.create(model);
        
        // 调用AI生成推荐
        return chatClient.prompt(prompt).call().content();
    }
    
    /**
     * 获取热门内容
     */
    private String getPopularContent() {
        // 获取点击量高的内容作为热门内容
        return """
               1. "人工智能的发展趋势与未来展望" - 科技类文章 (点击量: 1250)
               2. "春天的散文诗" - 散文类作品 (点击量: 980)
               3. "Java编程最佳实践" - 技术教程 (点击量: 870)
               4. "区块链技术原理与应用" - 科技类文章 (点击量: 760)
               5. "夏日荷塘" - 散文类作品 (点击量: 650)
               """;
    }
    
    /**
     * 模拟获取用户点赞过的内容
     * 实际项目中应该从用户点赞记录表中查询
     */
    private String getMockLikedContent(Integer userId) {
        // 这里应该从数据库查询用户点赞记录
        return """
               1. "深度学习在图像识别中的应用" - 科技类文章
               2. "秋日私语" - 散文类作品
               3. "Spring Boot微服务架构详解" - 技术教程
               """;
    }
    
    /**
     * 获取可推荐的内容列表
     * 实际项目中应该排除用户已点赞的内容
     */
    private String getAvailableContent(Integer userId) {
        // 这里应该从数据库查询可推荐的内容，并排除用户已点赞的内容
        return """
               1. "机器学习算法详解" - 科技类文章
               2. "冬日雪景" - 散文类作品
               3. "Vue.js前端开发实战" - 技术教程
               4. "5G通信技术的发展前景" - 科技类文章
               5. "海边的回忆" - 散文类作品
               6. "Python数据分析入门" - 技术教程
               7. "物联网技术应用场景分析" - 科技类文章
               8. "山间小径" - 散文类作品
               """;
    }
}